# -*- coding: utf-8 -*-

import json

import model

print model.name


# 在python中可以通过__slots__属性现在类的属性，如下

class Student(object):
    __slots__ = ('_name', '_age', '_score')

    def __init__(self, name, age):
        self._name = name
        self._age = age

    def get_info(self):
        return self._name + " : " + str(self._age)

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, (int, float)):
            raise TypeError('不是数')
        if value < 0 or value > 100:
            raise TypeError('分数在0 - 100 之间')
        self._score = value

    def __str__(self):
        return str(json.dumps({'name': self._name, 'age': self._age, 'score': self._score}, encoding='utf-8',
                              ensure_ascii=False))


xm = Student('小明', 22)
print xm.get_info()

xm.score = 99

print xm


# __iter__
# 如果一个类想被用于for ... in循环，类似list或tuple那样，就必须实现一个__iter__()方法，该方法返回一个迭代对象，然后，
# Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值，直到遇到StopIteration错误时退出循环。

# 实现将对象中的第i个元素取出

class Fib(object):
    def __init__(self):
        self._a = 0
        self._b = 1
        self._c = 1

    # 是类自己可以被迭代，但是需要实现next()方法
    def __iter__(self):
        return self

    def next(self):
        if (self._a > 1000):
            raise StopIteration
        self._c = self._a + self._b
        self._a = self._b
        self._b = self._c
        return self._c

    # 实现获取其中第n个元素或者是实现切片，但是对于切片， 需要考虑step的问题， 但是下边的实现没有考虑切片的问题
    def __getitem__(self, item):
        a, b = 1, 2
        if isinstance(item, int):
            for x in range(item):
                a, b = b, a + b
            return a
        if isinstance(item, slice):
            L = []
            for x in range(item.stop):
                a, b = b, a + b
                L.append(a)
            return L
# __setitem__()实现这个方法将对象视为像list，dict一样进行赋值
# __delitem__()实现这个方法可以将对象视为像list，dict一样进行元素删除
# 在对象中， 我们调用属性时，如果发现属性不存在， 那么就会抛出异常， 我们可以使用__getattr__()方法对这种没有属性的情况统一做处理
# __call__()，实现这个方法可以让实例自身可以被当成方法调用

for x in Fib():
    print x

print Fib()[2: 10]
